package sifeap.bl.ejb.gestionarchivos;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.activation.MimetypesFileTypeMap;
import javax.ejb.Stateless;

import sifeap.entities.gestionarchivos.valueobject.GestionArchivoVO;
import sifeap.exception.SifeapException;
import sifeap.util.Util;

/**
 * Session Bean implementation class EventoBL
 */
@Stateless(name="GestionArchivosBL")
public class GestionArchivosBL implements GestionArchivosBLLocal {
	
    /**
     * Default constructor. 
     */
    public GestionArchivosBL() {}

	@Override
	public File guardarArchivo(String nombreArchivo, InputStream inputStream, String parametroUbicacion) throws SifeapException {
		File archivo = null;
		try {
			String directorio = this.obtenerDirectorio(parametroUbicacion);
			
			//Se obtiene la extension del archivo
			String extension = nombreArchivo.substring(nombreArchivo.lastIndexOf('.'), nombreArchivo.length());
			
			//Debe modificar el nombre del archivo			
			nombreArchivo = (nombreArchivo.replace(extension, "").concat("_").concat(Util.obtenerAleatorio())).concat(extension);
			
			//Escribe el archivo
			Util.escribirArchivo(directorio, nombreArchivo, inputStream);
			
			archivo = new File(directorio + nombreArchivo);
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return archivo;
	}

	@Override
	public GestionArchivoVO obtenerArchivo(String nombreArchivo, String parametroUbicacion) throws SifeapException {
		GestionArchivoVO gestionArchivoVo = null;
		
		try {
			String directorio = this.obtenerDirectorio(parametroUbicacion);
			File archivo = new File(directorio + nombreArchivo); //Crea el archivo virtual
			InputStream inputStream = new FileInputStream(archivo); //Crea el inputStream para el archivo
			String tipoContenido = new MimetypesFileTypeMap().getContentType(archivo); //Obtiene el tipo de archivo
			
			gestionArchivoVo = new GestionArchivoVO();
			gestionArchivoVo.setContentType(tipoContenido);
			gestionArchivoVo.setInputStream(inputStream);
			gestionArchivoVo.setNombreArchivo(nombreArchivo);
			
		} catch (Exception e) {
			throw new SifeapException(e);
		}
		
		return gestionArchivoVo;
	}
	
	@Override
	public boolean eliminarArchivo(String nombreArchivo, String parametroUbicacion) throws SifeapException {
		String directorio = obtenerDirectorio(parametroUbicacion);
		return (Util.borrarArchivo(directorio, nombreArchivo));
	}
	
	private String obtenerDirectorio(String parametroUbicacion) throws SifeapException {
		try {
			//Obtiene el parametro de las rutas
			String directorio = Util.obtenerValorParametro(parametroUbicacion);
			
			//Verifica que el directorio exista
			if (!(directorio != null && directorio.trim().length() > 0)) {
				throw new SifeapException(Util.obtenerMensaje("sifeap.bl.bundles.mensajes", "sifeap.gestionarchivos.subirarchivo.error1"));
			}
			
			//Verifica si el directorio termina en separador
			if (!directorio.endsWith(File.separator)) {
				directorio = directorio.concat(File.separator);
			}
			
			return directorio;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
}
